#ifndef _OPENGLAPPFRAMEWORK_MATERIAL_H_
#define _OPENGLAPPFRAMEWORK_MATERIAL_H_

#include "OpenglAppFramework/inc/PlugIn/PlugIn.h"
#include "OpenglAppFramework/inc/Texture.h"
#include "OpenglAppFramework/inc/glm/glm.hpp"
#include <vector>
#include <string>
#include <utility>

class TextureInfo {
public:
    std::string file_path;
    unsigned int tex_unit_id;
    Texture texture;
};

class Shader;
class Material : public PlugIn {
public:
    Material(const std::string& name);
    ~Material();
    
    /**
     * @brief 设置各种贴图的文件路径，空字符串表示没有贴图
     */
    void setTexturePath(const std::string& tex_path, 
        const std::string& light_tex_path, const std::string& norm_tex_path, const std::string& shicha_tex_path);

    int setConfigData(const nlohmann::json& data) override;

    /**
     * @brief 加载所有资源（贴图）
     * @return int 成功返回0，否则返回-1
     */
    int init() override;

    /**
     * @brief 释放所有资源
     */
    void destroy() override;
    // void routine() override;

    /**
     * @brief 不包含纹理信息，纹理由TextureManager上传
     */
    void uploadShaderData(Shader* shader) override;
    // void actuveAndBindTextures();

    // /**
    //  * @brief 获取纹理id和在着色器中的的名称
    //  */
    // void getTextureIdName(TextureIdName& out) const;

    glm::vec3 material_color;
    glm::vec3 specula_color;
    float shininess;

    TextureInfo image;          // 纹理
    TextureInfo light_map;      // 高光反射
    TextureInfo norm_map;       // 法线
    TextureInfo shicha_map;     // 视差
};

#endif//_OPENGLAPPFRAMEWORK_MATERIAL_H_
